package Demo;

public class Test {
    public static void main(String[] args) {
        Animal animal1 = new Dog();
//        Dog dog = (Dog)animal1;
//        dog.name = "haha";
//        dog.bark();

        //向下转型不安全，向下转型要求父类对象原来指向要转型的子类对象
        System.out.println("=======");
        //此处编译不会报错，但是一旦执行就不会报错，因为此处的animal本来是dog
        if(animal1 instanceof Bird) {
            Bird bird = (Bird)animal1;
            bird.fly();
        }

        //instanceof  判断animal是不是引用了一个bird对象
        //关键字 可以理解为animal是不是真的引用了一个bird对象

        //向下转型不安全，一般很少使用，所以引入了instanceof关键字



//        Animal animal2= new Dog();
//
    }
}


class Animal {
    public String name;
    public int age;

    public void eat() {
        System.out.println(name + "eat");
    }
}

class Dog extends Animal{

    public void bark() {
        System.out.println("wangwang");
    }
    public void eat() {
        System.out.println(name + "eat dog food");
    }
}

class Bird extends Animal{

    public void fly() {
        System.out.println("fly");
    }
    public void eat() {
        System.out.println(name + "eat bird food");
    }
}

class Shape {
    public void draw() {
        System.out.println("画图形");
    }
}
class Rect extends Shape{
    public void draw() {
        System.out.println("画矩形");
    }
}

class Cycle extends Shape{
    public void draw() {
        System.out.println("画圆形");
    }

    public void drawMap(Shape[] shapes) {
        for (Shape shape:shapes) {
            shape.draw();
        }
    }
    public static void main(String[] args) {
        Shape[] shapes = new Shape[]{new Cycle(),new Rect()};
        Cycle cycle = new Cycle();
        cycle.drawMap(shapes);
    }
}


//构造方法没有多态性
//避免在构造方法内调用重写的方法
//属性没有多态性


//避免在构造方法当中调用重写的方法
//当在父类的构造方法当中调用父类和子类同名重写的方法，此时会调用子类的
//在父类方法当中调用重写方法，会调用子类的，但是由于此时父类还没构造完成，所以this.num还没被初始化（因为this.num）是子类的成员变量
//但是在调用父类构造之前，super.num已经被初始化完成了（）

//这段代码尽量不要使用，如果不是必要的话，除了考试会考，基本不会出现
class B {

    public B() {
        func();
    }
    int num = 100;


    public void func() {
        System.out.println("base func");
    }
}

class D extends B {
    private int num = 10;
    public D() {
        super();
    }
    public void func() {
        System.out.println("derived class");
        System.out.println(this.num);
        System.out.println(super.num);
    }

    public static void main(String[] args) {
        D d = new D();
//        System.out.println(d.num);

    }


}


